package com.ng.desktop.expansionsa.view;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.io.File;

import javax.swing.JDesktopPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.ng.desktop.expansionsa.services.NGConfiguration;
import com.ng.desktop.expansionsa.view.alquiler.AlquilerFrame;
import com.ng.desktop.expansionsa.view.articulo.ArticuloFrame;
import com.ng.desktop.expansionsa.view.cliente.ClienteFrame;
import com.ng.desktop.expansionsa.view.reporte.ReporteAlquileresFrame;
import com.ng.framework.util.NGOSUtil;
import com.ng.framework.view.desktop.NGGUIUtils;

@Component("frameContainer")
public class FrameContainer extends JFrame implements ActionListener {

	private static final long serialVersionUID = 4218532460895412585L;

	private JMenuBar menuBarra;
	private JMenu menuArchivo;
	private JMenu menuAyuda = new JMenu();
	private JMenu menuGestionar;
	private JMenu menuReportes;
	private JMenu menuHerramientas;
	private JMenuItem menuItemClientes;
	private JMenuItem menuItemArticulos;
	private JMenuItem menuItemAlquileres;
	private JMenuItem menuItemReporteAlquileres;
	private JMenuItem menuItemGenerarBackup;
	private JMenuItem menuItemRestaurarBackup;
	private JMenuItem menuItemSalir;
	private JMenuItem menuAcerca;

	private ClienteFrame clienteFrame;
	private ArticuloFrame articuloFrame;
	private AlquilerFrame alquilerFrame;
	private ReporteAlquileresFrame reporteAlquileresFrame;

	private JDesktopPane desktopPane;

	private final NGConfiguration ngConfiguration;

	@Autowired(required = true)
	public FrameContainer(NGConfiguration ngConfiguration) {
		this.ngConfiguration = ngConfiguration;
		this.initComponents();
		this.buildGui();
		this.setIconImage(NGGUIUtils.getImageIcon("icons/ng.png").getImage());
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

	private void initComponents() {
		this.menuBarra = new JMenuBar();
		this.menuArchivo = new JMenu("Archivo");
		menuArchivo.setMnemonic('a');
		this.menuAyuda = new JMenu("Ayuda");
		menuAyuda.setMnemonic('y');
		this.menuAcerca = new JMenuItem("Acerca de...");
		menuAcerca.setMnemonic('a');
		menuAcerca.addActionListener(this);
		this.menuGestionar = new JMenu("Gestionar");
		menuGestionar.setMnemonic('g');
		this.menuReportes = new JMenu("Reportes");
		menuReportes.setMnemonic('r');
		this.menuHerramientas = new JMenu("Herramientas");
		menuHerramientas.setMnemonic('h');
		this.menuItemClientes = new JMenuItem("Clientes");
		menuItemClientes.setMnemonic('c');
		menuItemClientes.addActionListener(this);
		this.menuItemArticulos = new JMenuItem("Artículos");
		menuItemArticulos.setMnemonic('a');
		menuItemArticulos.addActionListener(this);
		this.menuItemAlquileres = new JMenuItem("Alquileres");
		menuItemAlquileres.setMnemonic('l');
		menuItemAlquileres.addActionListener(this);
		this.menuItemGenerarBackup = new JMenuItem("Generar backup");
		menuItemGenerarBackup.setMnemonic('g');
		menuItemGenerarBackup.addActionListener(this);
		this.menuItemRestaurarBackup = new JMenuItem("Restaurar backup");
		menuItemRestaurarBackup.setMnemonic('r');
		menuItemRestaurarBackup.addActionListener(this);
		this.menuItemReporteAlquileres = new JMenuItem("Reporte de alquileres");
		menuItemReporteAlquileres.setMnemonic('l');
		menuItemReporteAlquileres.addActionListener(this);
		this.menuItemSalir = new JMenuItem("Salir");
		menuItemSalir.setMnemonic('s');
		menuItemSalir.addActionListener(this);
		this.desktopPane = new JDesktopPane();
	}

	// Component initialization
	private void buildGui() {

		this.setContentPane(desktopPane);

		this.setSize(new Dimension(1024, 600));
		this.setTitle(ngConfiguration.getApplicationTitle() + " - v 1.0.2");

		// Arbol Menu Archivo
		menuArchivo.add(menuGestionar);
		menuArchivo.add(menuReportes);
		menuArchivo.add(menuHerramientas);
		menuArchivo.addSeparator();
		menuArchivo.add(menuItemSalir);

		// Arbol Menu Gestionar
		menuGestionar.add(menuItemClientes);
		menuGestionar.add(menuItemArticulos);
		menuGestionar.add(menuItemAlquileres);
		menuGestionar.addSeparator();

		menuReportes.add(menuItemReporteAlquileres);

		menuHerramientas.add(menuItemGenerarBackup);
		menuHerramientas.add(menuItemRestaurarBackup);

		// Arbol Menu Ayuda
		menuAyuda.add(menuAcerca);

		// Barra
		menuBarra.add(menuArchivo);
		menuBarra.add(menuAyuda);

		this.setJMenuBar(menuBarra);
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == menuItemClientes) {
			if (clienteFrame == null || !clienteFrame.isDisplayable()) {
				clienteFrame = new ClienteFrame();
				desktopPane.add(clienteFrame);
				clienteFrame.setVisible(true);
			} else {
				clienteFrame.toFront();
			}
		} else if (e.getSource() == menuItemArticulos) {
			if (articuloFrame == null || !articuloFrame.isDisplayable()) {
				articuloFrame = new ArticuloFrame();
				desktopPane.add(articuloFrame);
				articuloFrame.setVisible(true);
			} else {
				articuloFrame.toFront();
			}
		} else if (e.getSource() == menuItemAlquileres) {
			if (alquilerFrame == null || !alquilerFrame.isDisplayable()) {
				alquilerFrame = new AlquilerFrame();
				desktopPane.add(alquilerFrame);
				alquilerFrame.setVisible(true);
			} else {
				alquilerFrame.toFront();
			}
		} else if (e.getSource() == menuItemReporteAlquileres) {
			if (reporteAlquileresFrame == null || !reporteAlquileresFrame.isDisplayable()) {
				reporteAlquileresFrame = new ReporteAlquileresFrame();
				desktopPane.add(reporteAlquileresFrame);
				try {
					reporteAlquileresFrame.setMaximum(true);
				} catch (PropertyVetoException e1) {
					e1.printStackTrace();
				}
				reporteAlquileresFrame.setVisible(true);
			} else {
				alquilerFrame.toFront();
			}
		} else if (e.getSource() == menuItemGenerarBackup) {
			JFileChooser fileChooser = new JFileChooser();
			fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
			if (fileChooser.showSaveDialog(FrameContainer.this) == JFileChooser.APPROVE_OPTION) {

				NGOSUtil.exec(this.getExternalFilePath("mySqlBackup"), fileChooser.getSelectedFile().getPath(), null, null);
			}
		} else if (e.getSource() == menuItemRestaurarBackup) {
			JFileChooser fileChooser = new JFileChooser();
			fileChooser.setFileFilter(new FileFilter() {
				private static final char EXTENSION_SEPARATOR = '.';
				private static final String BACKUP_FILE_EXTENSION = "sql";

				@Override
				public String getDescription() {
					return "Archivos de backup";
				}

				@Override
				public boolean accept(File f) {
					int dot = f.getName().lastIndexOf(EXTENSION_SEPARATOR);
					return BACKUP_FILE_EXTENSION.equals(f.getName().substring(dot + 1));
				}
			});
			if (fileChooser.showOpenDialog(FrameContainer.this) == JFileChooser.APPROVE_OPTION) {
				NGOSUtil.exec(this.getExternalFilePath("mySqlRestore"), fileChooser.getSelectedFile().getPath(), null, null);
			}
		} else if (e.getSource() == menuItemSalir) {
			if (JOptionPane.showConfirmDialog(this, "¿Está seguro que abandonar la aplicación?", "Salir",
					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
				this.dispose();
			}
		} else if (e.getSource() == menuAcerca) {
			new AyudaDialog(this).setVisible(true);
		}

	}

	public JDesktopPane getDesktopPane() {
		return desktopPane;
	}

	public String getExternalFilePath(String externalFile) {

		String extension = ".sh";

		if (NGOSUtil.isWindows()) {
			extension = ".bat";
		}

		return System.getProperty("configuration.path") + File.separator + externalFile + extension;
	}

}
